#!/usr/bin/env ruby


##############################################################################
# Example for testing Quasi Distance Transformation on Gray Level Images     #
##############################################################################

$LOAD_PATH << File.expand_path("../../../lib/rubyFulguro/fulguro")

require 'fulguro'
include Fulguro


### PROCEDURES #########################################################


def quasiDistance(im_indicatrice, im_associe, imin, connexity)
  nhb = FLGR_Data2D.new(imin.spp,imin.type,connexity)
  imw1 = FLGR_Data2D.new(imin)
  imw2 = FLGR_Data2D.new(imin)
  imtemp1 = FLGR_Data2D.new(imin)

  flgr2d_copy(imw1,imin)
  flgr2d_clear_all(im_indicatrice)
  flgr2d_clear_all(im_associe)

  vol1 = flgr2d_measure_volume(imw1)[0]
  vol2 = vol1+1
  
  i=0

  while vol2>vol1
    i += 1
    vol2 = vol1
    
    flgr2d_erode(imw2, imw1, nhb)
    flgr2d_arith_sub(imw1, imw1, imw2)

    flgr2d_replace(imtemp1,imw1,">=",im_associe,i,0);
    
    flgr2d_arith_sup(im_indicatrice, imtemp1, im_indicatrice)
    flgr2d_arith_sup(im_associe, imw1, im_associe)

    flgr2d_copy(imw1,imw2)
    
    vol1 = flgr2d_measure_volume(imw1)[0]
  end
  flgr2d_replace(im_indicatrice, im_indicatrice, "==", i, 0, im_indicatrice)
end

def descente(imout,imin,connexity)
  nhb = FLGR_Data2D.new(imin.spp,imin.type,connexity)
  imw1 = FLGR_Data2D.new(imin)
  imw2 = FLGR_Data2D.new(imin)
  imtemp1 = FLGR_Data2D.new(imin)
  imtemp2 = FLGR_Data2D.new(imin)
  
  flgr2d_copy(imw1,imin)

  vol1 = flgr2d_measure_volume(imw1)[0]
  vol2 = vol1 + 1

  i=0
  
  while vol2>vol1:
      i = i + 1
    vol2 = vol1
    
    flgr2d_erode(imw2, imw1, nhb)
    flgr2d_arith_sub(imtemp1,imw1,imw2)
    flgr2d_arith_add(imtemp2,imw2,1)

    flgr2d_replace(imw1, imtemp1, ">=", 2, imtemp2, imw1)

    vol1 = flgr2d_measure_volume(imw1)[0]
  end
  flgr2d_copy(imout,imw1)
end

##################################################################
### MAIN #########################################################
##################################################################

imin = flgr2d_load_pgm('../../images/gray/beans.pgm')
imqdist1 = FLGR_Data2D.new(imin)
imresidu = FLGR_Data2D.new(imin)
imqdist2 = FLGR_Data2D.new(imin)


flgr2d_arith_invert(imin,imin)

quasiDistance(imqdist1,imresidu,imin,FLGR_8_CONNEX)

descente(imqdist2,imqdist1,FLGR_8_CONNEX)

flgr2d_save_pgm(imqdist1,"quasidistance_perche_fulguro.pgm")
flgr2d_save_pgm(imqdist2,"quasidistance_fulguro.pgm")

flgr2d_save_pgm(imresidu,"quasidistance_residu_fulguro.pgm")

flgr_display(imin,"imin",
             imqdist2,'quasidistance.pgm',
             imresidu,'residu.pgm')

